#pragma once
#include "XSSL.h"
struct ssl_ctx_st;
class XSSLCtx{
public:
    /**
     * 初始化SSL上下文用于服务器
     * 
     * @param crt_file 服务器证书文件路径
     * @param key_file 服务器私钥文件路径
     * @param ca_file CA证书文件路径
     * 
     * @return 成功返回true，失败返回false
     * 
     * 此函数负责初始化SSL上下文，用于服务器端SSL连接的配置
     * 它会加载服务器的证书和私钥，并进行有效性检查
     */
    virtual bool InitServer(const char* crt_file, const char* key_file,const char*ca_file=0);
    XSSLCtx();
    ~XSSLCtx();
    /**
     * 创建一个新的XSSL对象并与其关联一个socket
     * 
     * @param socket 要关联的socket描述符
     * @return 返回一个XSSL对象，如果创建失败或参数无效，则返回默认构造的XSSL对象
     * 
     * 此函数首先检查传入的socket描述符是否有效，以及ssl_ctx_成员变量是否已初始化
     * 如果检查失败，函数将返回一个默认构造的XSSL对象，而不进行任何进一步的操作
     * 如果检查通过，函数将使用ssl_ctx_创建一个新的SSL对象，并将其与传入的socket描述符关联
     * 最后，将新创建的SSL对象赋给xssl，并返回xssl对象
     */
    XSSL NewXSSL(int socket);
    /**
     * 初始化客户端SSL上下文
     * 
     * 该函数通过调用OpenSSL库的TLS_client_method函数来创建一个新的SSL上下文对象
     * 它用于后续的SSL通信初始化如果无法成功创建SSL上下文，则返回false
     * 
     * @param ca_file 包含信任的CA证书的文件路径用于验证服务器证书的有效性
     * @return 成功初始化SSL上下文返回true，否则返回false
     */
    virtual bool InitClient(const char*ca_file=0);
    //
    void Close();
private:
    ssl_ctx_st* ssl_ctx_=nullptr;//SSL_CTX *
    /**
     * 设置SSL上下文的验证选项
     * @param ca_file 包含可信CA证书的文件路径
     * 
     * 此函数配置SSL上下文以验证对等实体的证书，并指定用于验证的CA证书文件
     * 如果ca_file参数为空，则不进行任何操作
     */
    void SetVerify(const char*ca_file);
};